package com.kgc.sbt.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executor;

/**
 * @Auther: Administrator
 * @Date: 2021年 05月26日 16:09
 * @Description: 自定义线程池配置类
 */

@EnableAsync
@Slf4j
@Component
@ConfigurationProperties(prefix = "async.thread")
public class TaskExcutorConfig {

    // 从配置文件中读取自定义配置
    // 核心线程数
    @Value("${async.thread.core_pool_size}")
    private Integer corePoolSize;

    // 最大线程数
    @Value("${async.thread.max_pool_size}")
    private Integer maxPoolSize;

    // 缓存队列容量
    @Value("${async.thread.queue_capacity}")
    private Integer queueCapacity;

    /**
     * @param:
     * @return:
     * @auther: hcc
     * @date: 2021/5/26 0026 16:13
     * 功能描述: 配置自定义线程池
     * 三个核心参数关系;
     * 当请求需要线程池处理：先判断CorePoolSize有没有满，如果没有满，就直接用新的线程处理
     * 如果满了，判断缓存队列是否满，如果没有，直接放入队列，等待线程处理
     * 如果满了，看最大线程有没有满，如果没有，创建新的线程处理，如果满了，交给饱和策略处理
     */
    @Bean
    public Executor asyncServiceExecutor(){
        log.info("------- asyncServiceExecutor begin -------");

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        // 设置核心线程数，允许系统一直保留此处指定的线程数大小，存放在线程池中
        executor.setCorePoolSize(corePoolSize);

        // 设置最大线程数
        executor.setMaxPoolSize(maxPoolSize);

        // 设置队列缓存大小
        executor.setQueueCapacity(queueCapacity);

        // 自定义线程别名
        executor.setThreadNamePrefix("kgc-async-thread-");

        // 初始化线程
        executor.initialize();

        log.info("------- asyncServiceExecutor end -------");

        return executor;
    }
}
